第五步:安装与测试¶
练习 1 - 安装规则¶
通常,仅仅构建一个可执行文件是不够的,它还应该是可安装的。使用 CMake,我们可以使用 install()
命令来指定安装规则。在 CMake 中支持本地安装通常非常简单,只需指定安装位置以及要安装的目标和文件。
目标¶
安装 Tutorial
可执行文件和 MathFunctions
库。
有用的材料¶
要编辑的文件¶
MathFunctions/CMakeLists.txt
CMakeLists.txt
开始入门¶
起始代码在 Step5
目录中提供。在本练习中,完成 TODO 1
到 TODO 4
。
首先,更新 MathFunctions/CMakeLists.txt
以将 MathFunctions
和 tutorial_compiler_flags
库安装到 lib
目录。在同一文件中,指定安装 MathFunctions.h
到 include
目录所需的安装规则。
然后,更新顶层 CMakeLists.txt
以将 Tutorial
可执行文件安装到 bin
目录。最后,任何头文件都应安装到 include
目录。请记住,TutorialConfig.h
位于 PROJECT_BINARY_DIR
中。
构建和运行¶
创建一个名为 Step5_build
的新目录。运行 cmake
可执行文件或 cmake-gui
来配置项目,然后使用您选择的构建工具构建它。
然后,通过使用 --install
选项运行安装步骤,该选项用于 cmake
命令(在 3.15 中引入,旧版本的 CMake 必须使用 make install
)从命令行执行。此步骤将安装相应的头文件、库和可执行文件。例如
cmake --install .
对于多配置工具,不要忘记使用 --config
参数来指定配置。
cmake --install . --config Release
如果使用 IDE,只需构建 INSTALL
目标即可。您可以从命令行构建相同的安装目标,如下所示
cmake --build . --target install --config Debug
CMake 变量 CMAKE_INSTALL_PREFIX
用于确定文件将要安装到的根目录。如果使用 cmake --install
命令,则可以通过 --prefix
参数覆盖安装前缀。例如
cmake --install . --prefix "/home/myuser/installdir"
导航到安装目录并验证已安装的 Tutorial
运行正常。
解决方案¶
我们项目的安装规则相当简单
对于
MathFunctions
,我们希望将库和头文件分别安装到lib
和include
目录。对于
Tutorial
可执行文件,我们希望将可执行文件和配置的头文件分别安装到bin
和include
目录。
因此,在 MathFunctions/CMakeLists.txt
的末尾,我们添加
TODO 1:点击显示/隐藏答案
set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs} DESTINATION lib)
和
TODO 2:点击显示/隐藏答案
install(FILES MathFunctions.h DESTINATION include)
用于 Tutorial
可执行文件和配置的头文件的安装规则类似。在顶层 CMakeLists.txt
的末尾,我们添加
TODO 3,4:点击显示/隐藏答案
install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)
这就是创建教程的基本本地安装所需的一切。
练习 2 - 测试支持¶
CTest 提供了一种轻松管理项目测试的方法。可以通过 add_test()
命令添加测试。虽然本教程未明确涵盖,但 CTest 与其他测试框架(例如 GoogleTest
)之间存在很多兼容性。
目标¶
使用 CTest 为我们的可执行文件创建单元测试。
有用的材料¶
要编辑的文件¶
CMakeLists.txt
开始入门¶
起始源代码在 Step5
目录中提供。在本练习中,完成 TODO 5
到 TODO 9
。
首先,我们需要启用测试。接下来,开始使用 add_test()
向我们的项目添加测试。我们将逐步完成添加 3 个简单测试,然后您可以根据需要添加其他测试。
构建和运行¶
导航到构建目录并重建应用程序。然后,运行 ctest 可执行文件:ctest -N
和 ctest -VV
。对于多配置生成器(例如 Visual Studio),必须使用 -C <mode>
标志指定配置类型。例如,要在 Debug 模式下运行测试,请从构建目录(而不是 Debug 子目录!)使用 ctest -C Debug -VV
。Release 模式将从同一位置执行,但使用 -C Release
。或者,从 IDE 构建 RUN_TESTS
目标。
解决方案¶
让我们测试我们的应用程序。在顶层 CMakeLists.txt
文件的末尾,我们首先需要使用 enable_testing()
命令启用测试。
TODO 5:点击显示/隐藏答案
enable_testing()
启用测试后,我们将添加一些基本测试来验证应用程序是否正常工作。首先,我们使用 add_test()
创建一个测试,该测试运行 Tutorial
可执行文件,并传入参数 25。对于此测试,我们不检查可执行文件计算出的答案。此测试将验证应用程序是否运行,是否没有段错误或其他崩溃,并且具有零返回值。这是 CTest 测试的基本形式。
TODO 6:点击显示/隐藏答案
add_test(NAME Runs COMMAND Tutorial 25)
接下来,让我们使用 PASS_REGULAR_EXPRESSION
测试属性来验证测试的输出是否包含某些字符串。在本例中,验证当提供不正确数量的参数时是否打印了用法消息。
TODO 7:点击显示/隐藏答案
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
)
我们将添加的下一个测试验证计算值是否确实是平方根。
TODO 8:点击显示/隐藏答案
add_test(NAME StandardUse COMMAND Tutorial 4)
set_tests_properties(StandardUse
PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2"
)
一个测试不足以让我们确信它适用于所有传入的值。我们应该添加更多测试来验证这一点。为了轻松添加更多测试,我们创建了一个名为 do_test
的函数,该函数运行应用程序并验证对于给定的输入,计算出的平方根是否正确。对于 do_test
的每次调用,都会向项目中添加另一个测试,其名称、输入和预期结果基于传递的参数。
TODO 9:点击显示/隐藏答案
function(do_test target arg result)
add_test(NAME Comp${arg} COMMAND ${target} ${arg})
set_tests_properties(Comp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result}
)
endfunction()
# do a bunch of result based tests
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is (-nan|nan|0)")
do_test(Tutorial 0.0001 "0.0001 is 0.01")